package com.example.CarManagement.Utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;

public class sysUtils {

    // 时间格式：年月日时分秒毫秒
    private static final DateTimeFormatter DF = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

    // 上一毫秒时间戳的字符串缓存，用来做“同一毫秒”判断
    private static volatile String lastTimeStr = "";

    // 同一毫秒内的顺序号，从 1 开始
    private static final AtomicInteger SEQ = new AtomicInteger(1);

    /**
     * 生成工号：prefix-yyyyMMddHHmmssSSS 或 prefix-yyyyMMddHHmmssSSSnnn（保证唯一）
     */
    public static String createId(String prefix) {
        // 1. 当前时间字符串
        LocalDateTime now = LocalDateTime.now();
        String timeStr = now.format(DF);

        // 2. 判断是否同一毫秒
        if (timeStr.equals(lastTimeStr)) {
            // 同一毫秒：自增顺序号
            int seq = SEQ.getAndIncrement();
            if (seq > 999) {
                // 极端高并发时自旋等待下一毫秒
                while (timeStr.equals(lastTimeStr)) {
                    now = LocalDateTime.now();
                    timeStr = now.format(DF);
                }
                SEQ.set(1);
            }
        } else {
            // 不同毫秒：顺序号重置
            lastTimeStr = timeStr;
            SEQ.set(1);
        }

        // 3. 拼接结果
        int seqVal = SEQ.get();
        String suffix = seqVal == 1 ? "" : String.format("%03d", seqVal - 1);
        return prefix + "-" + timeStr + suffix;
    }
}
